#include "VentanaAlumno.h"
#include "Alumno.h"
#include "ReproductorVideo.h"
#include "CajaChat.h"
#include <iostream>

VentanaAlumno::VentanaAlumno(Alumno* alumno) {
	this->alumno = alumno;

	this->set_title("Screencast Educacional (Alumno)");
	this->maximize();

	generarMenu();
	Gtk::Widget* pMenu = pUiManager->get_widget("/Menu");

	this->cajaH.set_homogeneous(false);
	this->cajaH.pack_start(*(alumno->get_reproductor_video()), Gtk::PACK_SHRINK);
	this->cajaH.pack_end(*(alumno->getCajaChat()), Gtk::PACK_EXPAND_WIDGET);
	this->cajaV.pack_start(*pMenu, Gtk::PACK_SHRINK);
	this->cajaV.pack_end(this->cajaH, Gtk::PACK_EXPAND_WIDGET);

	this->add(this->cajaV);
	this->show_all();
}

void VentanaAlumno::generarMenu() {
	this->pGrupo = Gtk::ActionGroup::create();
	this->pUiManager = Gtk::UIManager::create();

	this->pGrupo->add(Gtk::Action::create("MenuArchivo", "_Archivo"));
	this->pGrupo->add(Gtk::Action::create("Salir", "_Salir"),
			sigc::mem_fun(*this, &VentanaAlumno::salir));
	this->pGrupo->add(Gtk::Action::create("MenuCuenta", "_Cuenta"));
	this->pGrupo->add(Gtk::Action::create("Login", "_Login"),
			sigc::mem_fun(*this, &VentanaAlumno::login));
	this->pGrupo->add(Gtk::Action::create("Logout", "_Logout"),
			sigc::mem_fun(*this, &VentanaAlumno::logout));
	this->pGrupo->add(Gtk::Action::create("MenuDescargas", "_Descargas"));
	this->pGrupo->add(Gtk::Action::create("DescVideo", "_Video"),
			sigc::mem_fun(*this, &VentanaAlumno::bajarVideo));
	this->pGrupo->add(Gtk::Action::create("DescAdj", "_Archivos Adjuntos"),
			sigc::mem_fun(*this, &VentanaAlumno::bajarArchAdj));
	this->pGrupo->add(
			Gtk::Action::create("MenuInscripciones", "_Inscripciones"));
	this->pGrupo->add(Gtk::Action::create("Cartelera", "_Cartelera"),
			sigc::mem_fun(*this, &VentanaAlumno::inscripcion));

	this->pUiManager->insert_action_group(pGrupo);

	Glib::ustring ui_info = "<ui>"
		"  	<menubar name='Menu'>"
		"	<menu action='MenuArchivo'>"
		"      	<separator/>"
		"      	<menuitem action='Salir'/>"
		"    </menu>"
		"    <menu action='MenuCuenta'>"
		"       <menuitem action='Login'/>"
		"       <menuitem action='Logout'/>"
		" 	 </menu>"
		"	<menu action='MenuDescargas'>"
		"     	<menuitem action='DescVideo'/>"
		"     	<menuitem action='DescAdj'/>"
		"	</menu>"
		"	<menu action='MenuInscripciones'>"
		"      	<menuitem action='Cartelera'/>"
		"	</menu>"
		"  	</menubar>"
		"</ui>";

	pUiManager->add_ui_from_string(ui_info);
	this->anularLogin(true);
	this->anularBotones1(false);
	this->anularBotones2(false);
}

//***************************FUNCIONES DEL MENU********************************
void VentanaAlumno::bajarArchAdj() {
	int ret = 1;
	dialogoAdjuntos = new DialogoCarteleraAdjuntos;
	alumno->recibirCarteleraAdjuntos();
	dialogoAdjuntos->set_transient_for(*this);
	int clicked = dialogoAdjuntos->run();
	if ((clicked == Gtk::RESPONSE_OK)
			&& (dialogoAdjuntos->getCodigosSeleccionados().size() > 0)) {
		Gtk::FileChooserDialog dialGuardar(
				"Seleccione el directorio de destino",
				Gtk::FILE_CHOOSER_ACTION_SAVE);
		dialGuardar.set_transient_for(*this);
		dialGuardar.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
		dialGuardar.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);
		dialGuardar.set_current_name(dialogoAdjuntos->getCodigosSeleccionados());
		clicked = dialGuardar.run();
		if (clicked == Gtk::RESPONSE_OK)
			ret = alumno->bajarAdjunto(dialGuardar.get_filename());
	}
	delete dialogoAdjuntos;
}

void VentanaAlumno::salir() {
	Gtk::MessageDialog dialogo(*this, "Salir", 0, Gtk::MESSAGE_QUESTION,
			Gtk::BUTTONS_OK_CANCEL);
	dialogo.set_secondary_text("¿Seguro que quiere salir?");
	int clicked = dialogo.run();
	if (clicked == Gtk::RESPONSE_OK)
		Gtk::Main::quit();
}

void VentanaAlumno::login() {
	int ret = 1;
	DialogoLogin dialLogin;
	dialLogin.set_transient_for(*this);
	int clicked = dialLogin.run();
	if (clicked == Gtk::RESPONSE_OK)
		ret = alumno->login(dialLogin.getUsuario(), dialLogin.getClave(), '1');
	switch (ret) {
	case (0): {
		this->anularLogin(false);
		this->anularBotones1(true);
		this->anularBotones2(true);
		break;
	}
	case (-2): {
		this->crearDialogo("Campos vacios");
		break;
	}
	case (-3): {
		this->crearDialogo("Error de conectividad");
		break;
	}
	case (-4): {
		this->crearDialogo("Usuario/Clave erronea");
		break;
	}
	}
}

void VentanaAlumno::logout() {
	alumno->logout();
	alumno->desconectar();
	this->anularLogin(true);
	this->anularBotones1(false);
	this->anularBotones2(false);
	this->crearDialogo("Sesion finalizada");
}

void VentanaAlumno::inscripcion() {
	cartelera = new Cartelera();
	alumno->recibirCartelera();
	int ret = 1;
	cartelera->set_transient_for(*this);
	int clicked = cartelera->run();
	if (clicked == INSCRIPCION_CLASE) {
		DialogoInscripcion dialInscripcion;
		dialInscripcion.set_transient_for(*this);
		int click = dialInscripcion.run();
		if (click == Gtk::RESPONSE_OK) {
			ret = alumno->Inscribir(CLASE, dialInscripcion.getCodigo(),
					dialInscripcion.getClave());
		}
	}
	if (clicked == INSCRIPCION_CURSO) {
		DialogoInscripcion dialInscripcion;
		dialInscripcion.set_transient_for(*this);
		int click = dialInscripcion.run();
		if (click == Gtk::RESPONSE_OK) {
			ret = alumno->Inscribir(CURSO, dialInscripcion.getCodigo(),
					dialInscripcion.getClave());
		}
	}
	this->respuestaLogin(ret);
	delete cartelera;
}

void VentanaAlumno::bajarVideo() {
	dialogoVideo = new DialogoCarteleraVideo();
	alumno->recibirCarteleraVideos();
	int ret = 1;
	dialogoVideo->set_transient_for(*this);
	int clicked = dialogoVideo->run();
	if ((clicked == Gtk::RESPONSE_OK)
			&& (dialogoVideo->getCodigosSeleccionados().size() > 0)) {
		Gtk::FileChooserDialog dialGuardar(
				"Seleccione el directorio de destino",
				Gtk::FILE_CHOOSER_ACTION_SAVE);
		dialGuardar.set_transient_for(*this);
		dialGuardar.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
		dialGuardar.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);
		dialGuardar.set_current_name("Archivo1.avi");
		clicked = dialGuardar.run();
		if (clicked == Gtk::RESPONSE_OK) {
			ret = alumno->bajarVideo(dialogoVideo->getCodigosSeleccionados(),
					dialGuardar.get_filename());
		}
	}
	if(ret == 0)
		this->crearDialogo("Video descargado con exito");
	if(ret == -1)
		this->crearDialogo("Error de conectividad");
	delete dialogoVideo;
}

void VentanaAlumno::agregarClase(std::string codigo, std::string descripcion) {
	cartelera->getCursosCartelera()->agregarClase(codigo, descripcion);
}

void VentanaAlumno::agregarCurso(std::string codigo, std::string descripcion) {
	cartelera->getCursosCartelera()->agregarCurso(codigo, descripcion);
}

void VentanaAlumno::agregarClaseDeCurso(std::string codCurso,
		std::string codClase, std::string descripcion) {
	cartelera->getCursosCartelera()->agregarClaseDeCurso(codCurso, codClase,
			descripcion);
}

void VentanaAlumno::agregarVideosDeClasesDispo(std::string codClase,
		std::string codCurso) {
	dialogoVideo->getVideos()->agregarFila(codCurso, codClase);
}

void VentanaAlumno::agregarAdjuntosDeClasesDispo(std::string codClase,
		std::string codCurso, std::string nombreAdj) {
	dialogoAdjuntos->getAdjuntos()->agregarFila(codCurso, codClase, nombreAdj);
}

void VentanaAlumno::respuestaLogin(int respuesta) {
	switch (respuesta) {
	case (0): {
		this->crearDialogo("Inscripto con exito");
		break;
	}
	case (-1): {
		this->crearDialogo("Error de conectividad");
		break;
	}
	case (-2): {
		this->crearDialogo("El código es un campo necesario");
		break;
	}
	case (-3): {
		this->crearDialogo("Codigo invalido, por favor ingrese solo numeros");
		break;
	}
	case (-4): {
		this->crearDialogo(
				"En el codigo ingrese solo numeros y sin ceros adelante");
		break;
	}
	case (-5): {
		this->crearDialogo("Ya inscripto");
		break;
	}
	case (-6): {
		this->crearDialogo("No existe el curso/clase");
		break;
	}
	}
}

void VentanaAlumno::anularLogin(bool logeado) {
	this->pGrupo->get_action("Login")->set_sensitive(logeado);
}

void VentanaAlumno::anularBotones1(bool transmitiendo) {
	this->pGrupo->get_action("Logout")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("DescAdj")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("DescVideo")->set_sensitive(transmitiendo);
}

void VentanaAlumno::anularBotones2(bool transmitiendo) {
	this->pGrupo->get_action("Cartelera")->set_sensitive(transmitiendo);
}

void VentanaAlumno::crearDialogo(std::string comentario) {
	Gtk::MessageDialog dial_info(*this, comentario);
	dial_info.run();
}

void VentanaAlumno::levantar() {
	this->present();
}
//***************************************************************************

VentanaAlumno::~VentanaAlumno() {

}
